﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using Microsoft.TeamFoundation.Client;

namespace PsTFS.Objects.Methodes
{
    /// <summary>
    /// Méthode pour la création et la gestion des workitem
    /// </summary>
    public static partial class Methode
    {
        /// <summary>
        /// Copie du WorkItem sur le deuxième TFS
        /// </summary>
        /// <param name="tfs">TFS destinataire</param>
        /// <param name="nameProject">Nom du projet</param>
        /// <param name="Type">Type de workitem à créer</param>
        /// <param name="Title">Titre du workitem à créer</param>
        /// <param name="Param">Parametre supplementaire</param>
        /// <returns>Workitem créé</returns>
        public static WorkItem CreateWI(TeamFoundationServer tfs, string nameProject, string Type, string Title, params string[] Param)
        {
            WorkItem createWi = null;

            //Service TFS permet de travailler avec les WI TFS
            WorkItemStore store = (WorkItemStore)tfs.GetService(typeof(WorkItemStore));

            //Récupération des type de WI pour un projet
            WorkItemTypeCollection workItemTypes = store.Projects[nameProject].WorkItemTypes;

            if (workItemTypes.Contains(Type))
            {
                createWi = workItemTypes[Type].NewWorkItem();
                createWi.Title = Title;
                

                //Remplissage des champs du WI
                if (Param != null)
                {
                    foreach (string f in Param)
                    {
                        string[] sf = f.Split('|');
                        try
                        {
                            //Permet de vérifier si le champ peut etre copié
                            if (IsChampValide(sf[0]))
                                createWi.Fields[sf[0]].Value = sf[1];
                        }
                        catch (Exception e)
                        {
                            
                            Console.WriteLine(e.Message);
                            Log.AddLog(null, e.ToString());
                        }
                    }
                }
                try
                {
                    //Sauvegarde du WI dans le nouveau projet
                    createWi.Save();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    Log.AddLog(null, ex.ToString());
                }

            }
            return createWi;
        }
        /// <summary>
        /// Liste des camps de WI ne pouvant être copié
        /// </summary>
        /// <param name="champ"></param>
        /// <returns></returns>
        private static bool IsChampValide(string champ)
        {
            List<String> liste = new List<string>();
            liste.Add("IterationID");
            liste.Add("Iteration Path");
            liste.Add("State");
            liste.Add("Rev");
            liste.Add("Team Project");
            liste.Add("Node Name");
            liste.Add("Revised Date");
            liste.Add("Changed Date");
            liste.Add("ID");
            liste.Add("AreaID");
            liste.Add("Area Path");
            liste.Add("Authorized As");
            liste.Add("Assigned To");
            liste.Add("Changed By");
            liste.Add("Activated By");
            liste.Add("State Change Date");
            liste.Add("Activated Date");
            liste.Add("Resolved Date");
            liste.Add("Reason");
            liste.Add("Resolved By");
            liste.Add("Assigned To");
            liste.Add("Work Item Type");
            liste.Add("Closed By");
            liste.Add("Closed Date");
            liste.Add("Created Date");
            liste.Add("Created By");
            liste.Add("RelatedLinkCount");
            liste.Add("ExternalLinkCount");
            liste.Add("HyperLinkCount");
            liste.Add("AttachedFileCount");
            liste.Add("Revised Date");
            liste.Add("Changed Date");

            if (liste.Contains(champ))
                return false;
            else
                return true;
        }

    }
}
